home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / modules / FlockSvcUtils.jsm < prev    next >
Text File  |  2007-10-18  |  17KB  |  499 lines

  1. // BEGIN FLOCK GPL
  2. //
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. //
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. //
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. //
  15. // END FLOCK GPL
  16.  
  17. const CC = Components.classes;
  18. const CI = Components.interfaces;
  19. const CR = Components.results;
  20.  
  21. var EXPORTED_SYMBOLS = ["FlockSvcUtils"];
  22.  
  23. /******************************************************************************
  24.  * Flock Service Utilities
  25.  ******************************************************************************/
  26.  
  27. var FlockSvcUtils = {
  28.   // Interfaces for which we can add default implementations.
  29.   flockIWebService: {},
  30.   flockIManageableWebService: {},
  31.   flockIWebServiceAccount: {},
  32.   flockISocialWebServiceAccount: {},
  33.   flockIRichContentDropHandler: {}
  34. };
  35.  
  36. /******************************************************************************
  37.  * Utility Functions
  38.  ******************************************************************************/
  39.  
  40. // Get the Logger.
  41. // This adds the "_logger" property to the service.
  42. FlockSvcUtils.getLogger =
  43. function FlockSvcUtils_getLogger(aComponent)
  44. {
  45.   if (!aComponent._logger) {
  46.     aComponent._logger = CC["@flock.com/logger;1"]
  47.                          .createInstance(CI.flockILogger);
  48.     if (aComponent.shortName) {
  49.       // No shortName? Caller must call init.
  50.       aComponent._logger.init(aComponent.shortName);
  51.     }
  52.   }
  53.   return aComponent._logger;
  54. };
  55.  
  56. // Get Account Utilities.
  57. // This adds the "_acUtils" property to the service.
  58. FlockSvcUtils.getACUtils =
  59. function FlockSvcUtils_getACUtils(aComponent)
  60. {
  61.   if (!aComponent._acUtils) {
  62.     aComponent._acUtils = CC["@flock.com/account-utils;1"]
  63.                           .getService(CI.flockIAccountUtils);
  64.   }
  65.   return aComponent._acUtils;
  66. };
  67.  
  68. // Get Web Detective.
  69. // This adds the "_WebDetective" property to the service.
  70. // As a side effect, also adds the "_acUtils" property.
  71. FlockSvcUtils.getWD =
  72. function FlockSvcUtils_getWD(aComponent)
  73. {
  74.   if (!aComponent._WebDetective) {
  75.     if (aComponent.shortName) {
  76.       aComponent._WebDetective = this.getACUtils(aComponent)
  77.                                      .useWebDetective(aComponent.shortName
  78.                                      + ".xml");
  79.     } else {
  80.       // aComponent is not a Flock service.
  81.       throw CR.NS_ERROR_INVALID_ARG;
  82.     }
  83.   }
  84.   return aComponent._WebDetective;
  85. };
  86.  
  87. // Get Coop.
  88. // This adds the "_coop" property to the service.
  89. FlockSvcUtils.getCoop =
  90. function FlockSvcUtils_getCoop(aComponent)
  91. {
  92.   if (!aComponent._coop) {
  93.     aComponent._coop = CC["@flock.com/singleton;1"]
  94.                        .getService(CI.flockISingleton)
  95.                        .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  96.                        .wrappedJSObject;
  97.   }
  98.   return aComponent._coop;
  99. };
  100.  
  101. // Helper to create a "results" object commonly returned from services.
  102. FlockSvcUtils.newResults =
  103. function FlockSvcUtils_newResults()
  104. {
  105.   return CC["@mozilla.org/hash-property-bag;1"]
  106.          .createInstance(CI.nsIWritablePropertyBag2);
  107. };
  108.  
  109.  
  110. /******************************************************************************
  111.  * flockIWebService Default Method Implementations
  112.  ******************************************************************************/
  113. FlockSvcUtils.flockIWebService.addDefaultMethod =
  114. function addDefaultMethod(aComponent, aMethod) {
  115.  
  116.   var svc = aComponent;
  117.   var proto = aComponent.__proto__;
  118.  
  119.   switch (aMethod) {
  120.  
  121.     case "getAccount":
  122.       // flockIWebServiceAccount getAccount(in AString aUrn);
  123.       // NOTE: This requires an account constructor to be in a private
  124.       //       property on the service, named "_accountClassCtor".
  125.       if (!proto.getAccount) {
  126.         proto.getAccount =
  127.         function defaultImpl_getAccount(aUrn) {
  128.           svc._logger.debug("{flockIWebService}.getAccount('" + aUrn + "')");
  129.           var c_acct = FlockSvcUtils.getCoop(svc).get(aUrn);
  130.           // This is the constructor for the service account class.
  131.           var acct = new svc._accountClassCtor();
  132.           acct.urn = c_acct.id();
  133.           acct.username = c_acct.name;
  134.           return acct;
  135.         };
  136.       }
  137.       break;
  138.  
  139.     case "getAccounts":
  140.       // nsISimpleEnumerator getAccounts();
  141.       if (!proto.getAccounts) {
  142.         proto.getAccounts =
  143.         function defaultImpl_getAccounts() {
  144.           svc._logger.debug("{flockIWebService}.getAccounts()");
  145.           return FlockSvcUtils.getACUtils(svc)
  146.                               .getAccountsForService(svc.contractId);
  147.         };
  148.       }
  149.       break;
  150.  
  151.     case "logout":
  152.       // void logout();
  153.       if (!proto.logout) {
  154.         proto.logout =
  155.         function defaultImpl_logout() {
  156.           svc._logger.debug("{flockIWebService}.logout()");
  157.           var cookies = FlockSvcUtils.getWD(svc)
  158.                                      .getSessionCookies(svc.shortName);
  159.           if (cookies) {
  160.             FlockSvcUtils.getACUtils(svc).removeCookies(cookies);
  161.           }
  162.         };
  163.       }
  164.       break;
  165.  
  166.     default:
  167.       throw Components.results.NS_ERROR_INVALID_ARG;
  168.   } // switch (aMethod)
  169. };
  170.  
  171. /******************************************************************************
  172.  * flockIManageableWebService Default Method Implementations
  173.  ******************************************************************************/
  174. FlockSvcUtils.flockIManageableWebService.addDefaultMethod =
  175. function addDefaultMethod(aComponent, aMethod) {
  176.  
  177.   var svc = aComponent;
  178.   var proto = aComponent.__proto__;
  179.  
  180.   switch (aMethod) {
  181.  
  182.     case "docRepresentsSuccessfulLogin":
  183.       // boolean docRepresentsSuccessfulLogin(in nsIDOMHTMLDocument aDocument);
  184.       if (!proto.docRepresentsSuccessfulLogin) {
  185.         proto.docRepresentsSuccessfulLogin =
  186.         function defaultImpl_docRepresentsSuccessfulLogin(aDocument) {
  187.           svc._logger.debug("{flockIManageableWebService}.docRepresentsSuccessfulLogin()");
  188.           return FlockSvcUtils.getWD(svc).detect(svc.shortName, "loggedin",
  189.                                                  aDocument, null );
  190.         };
  191.       }
  192.       break;
  193.  
  194.     case "getAccountIDFromDocument":
  195.       // AString getAccountIDFromDocument(in nsIDOMHTMLDocument aDocument);
  196.       if (!proto.getAccountIDFromDocument) {
  197.         proto.getAccountIDFromDocument =
  198.         function defaultImpl_getAccountIDFromDocument(aDocument) {
  199.           svc._logger.debug("{flockIManageableWebService}.getAccountIDFromDocument()");
  200.           var results = FlockSvcUtils.newResults();
  201.           if (FlockSvcUtils.getWD(svc).detect(svc.shortName, "accountinfo",
  202.                                               aDocument, results))
  203.           {
  204.             return results.getPropertyAsAString("accountid");
  205.           }
  206.           return null;
  207.         };
  208.       }
  209.       break;
  210.  
  211.     case "getCredentialsFromForm":
  212.       // nsIPassword getCredentialsFromForm(in nsIDOMHTMLFormElement aForm);
  213.       if (!proto.getCredentialsFromForm) {
  214.         proto.getCredentialsFromForm =
  215.         function defaultImpl_getCredentialsFromForm(aForm) {
  216.           svc._logger.debug("{flockIManageableWebService}.getCredentialsFromForm()");
  217.  
  218.           aForm.QueryInterface(CI.nsIDOMHTMLFormElement);
  219.           var wd = FlockSvcUtils.getWD(svc);
  220.           var formType = "login";
  221.           var results = FlockSvcUtils.newResults();
  222.           if (!wd.detectForm(svc.shortName, formType, aForm, results)) {
  223.             formType = "signup";
  224.             results = FlockSvcUtils.newResults();
  225.             if (!wd.detectForm(svc.shortName, formType, aForm, results)) {
  226.               formType = "changepassword";
  227.               results = FlockSvcUtils.newResults();
  228.               if (!wd.detectForm(svc.shortName, formType, aForm, results)) {
  229.                 results = null;
  230.               }
  231.             }
  232.           }
  233.           if (results) {
  234.             return {
  235.               QueryInterface: function(aIID) {
  236.                 // FIXME: See https://bugzilla.flock.com/show_bug.cgi?id=9802
  237.                 if (!aIID.equals(CI.nsISupports) &&
  238.                     !aIID.equals(CI.nsIPassword) &&
  239.                     !aIID.equals(CI.flockIPassword))
  240.                 {
  241.                   throw CR.NS_ERROR_NO_INTERFACE;
  242.                 }
  243.                 return this;
  244.               },
  245.               host: "",
  246.               user: results.getPropertyAsAString("username"),
  247.               password: results.getPropertyAsAString("password"),
  248.               formType: formType
  249.             };
  250.           }
  251.           return null;
  252.         };
  253.       }
  254.       break;
  255.  
  256.     case "ownsDocument":
  257.       // boolean ownsDocument(in nsIDOMHTMLDocument aDocument);
  258.       if (!proto.ownsDocument) {
  259.         proto.ownsDocument =
  260.         function defaultImpl_ownsDocument(aDocument) {
  261.           svc._logger.debug("{flockIManageableWebService}.ownsDocument()");
  262.           // Note that ownsDocument() only gets called for documents hosted
  263.           // in a domain for this service... so if no further tests are
  264.           // necessary, it's ok to just return 'true' here.
  265.           return true;
  266.         };
  267.       }
  268.       break;
  269.  
  270.     case "ownsLoginForm":
  271.       // boolean ownsLoginForm(in nsIDOMHTMLFormElement aForm);
  272.       if (!proto.ownsLoginForm) {
  273.         proto.ownsLoginForm =
  274.         function defaultImpl_ownsLoginForm(aForm) {
  275.           svc._logger.debug("{flockIManageableWebService}.ownsLoginForm()");
  276.  
  277.           aForm.QueryInterface(CI.nsIDOMHTMLFormElement);
  278.           var wd = FlockSvcUtils.getWD(svc);
  279.           if (wd.detectForm(svc.shortName, "login", aForm,
  280.                             FlockSvcUtils.newResults()))
  281.           {
  282.             return true;
  283.           }
  284.           if (wd.detectForm(svc.shortName, "signup", aForm,
  285.                             FlockSvcUtils.newResults()))
  286.           {
  287.             return true;
  288.           }
  289.           if (wd.detectForm(svc.shortName, "changepassword", aForm,
  290.                             FlockSvcUtils.newResults()))
  291.           {
  292.             return true;
  293.           }
  294.           return false;
  295.         };
  296.       }
  297.       break;
  298.  
  299.     default:
  300.       throw CR.NS_ERROR_INVALID_ARG;
  301.   } // switch (aMethod)
  302. };
  303.  
  304. /******************************************************************************
  305.  * flockIWebServiceAccount Default Method Implementations
  306.  ******************************************************************************/
  307. FlockSvcUtils.flockIWebServiceAccount.addDefaultMethod =
  308. function addDefaultMethod(aComponent, aMethod) {
  309.  
  310.   var svc = aComponent;
  311.   var proto = aComponent.__proto__;
  312.  
  313.   switch (aMethod) {
  314.  
  315.     case "deactivate":
  316.       // void deactivate(in flockIListener aListener);
  317.       if (!proto.deactivate) {
  318.         proto.deactivate =
  319.         function defaultImpl_deactivate(aListener) {
  320.           svc._logger.debug("{flockIWebServiceAccount}.deactivate()");
  321.           var c_acct = FlockSvcUtils.getCoop(svc).get(this.urn);
  322.           c_acct.isPollable = false;
  323.           if (aListener) {
  324.             aListener.onSuccess(this, "deactivate");
  325.           }
  326.         };
  327.       }
  328.       break;
  329.  
  330.     case "login":
  331.       // void login(in flockIListener aListener);
  332.       if (!proto.login) {
  333.         proto.login =
  334.         function defaultImpl_login(aListener) {
  335.           svc._logger.debug("{flockIWebServiceAccount}.login()");
  336.           if (aListener) {
  337.             aListener.onError(this, "login", null);
  338.           }
  339.         };
  340.       }
  341.       break;
  342.  
  343.     case "logout":
  344.       // void logout(in flockIListener aListener);
  345.       if (!proto.logout) {
  346.         proto.logout =
  347.         function defaultImpl_logout(aListener) {
  348.           svc._logger.debug("{flockIWebServiceAccount}.logout()");
  349.           var c_acct = FlockSvcUtils.getCoop(svc).get(this.urn);
  350.           if (c_acct.isAuthenticated) {
  351.             c_acct.isAuthenticated = false;
  352.             CC[c_acct.serviceId].getService(CI.flockIWebService).logout();
  353.           }
  354.           if (aListener) {
  355.             aListener.onSuccess(this, "logout");
  356.           }
  357.         };
  358.       }
  359.       break;
  360.  
  361.     case "remove":
  362.       // void remove();
  363.       if (!proto.remove) {
  364.         proto.remove =
  365.         function defaultImpl_remove() {
  366.           svc._logger.debug("{flockIWebServiceAccount}.remove()");
  367.           var c_acct = FlockSvcUtils.getCoop(svc).get(this.urn);
  368.           CC[c_acct.serviceId].getService(CI.flockIWebService)
  369.                               .removeAccount(this.urn);
  370.         };
  371.       }
  372.       break;
  373.  
  374.     default:
  375.       throw CR.NS_ERROR_INVALID_ARG;
  376.   } // switch (aMethod)
  377. };
  378.  
  379. /******************************************************************************
  380.  * flockISocialWebServiceAccount Default Method Implementations
  381.  ******************************************************************************/
  382. FlockSvcUtils.flockISocialWebServiceAccount.addDefaultMethod =
  383. function addDefaultMethod(aComponent, aMethod) {
  384.  
  385.   var svc = aComponent;
  386.   var proto = aComponent.__proto__;
  387.  
  388.   switch (aMethod) {
  389.  
  390.     case "getFriendCount":
  391.       // void deactivate(in flockIListener aListener);
  392.       if (!proto.getFriendCount) {
  393.         proto.getFriendCount = 
  394.         function getFriendCount() {
  395.           var count = 0;
  396.           var c_acct = FlockSvcUtils.getCoop(svc).get(this.urn);
  397.           var c_friendslist = c_acct.friendsList;
  398.           if (c_friendslist) {
  399.             var friends = c_friendslist.children.enumerate();
  400.             while (friends.hasMoreElements()) {
  401.               count++;
  402.               friends.getNext();
  403.             }
  404.           }
  405.           return count;
  406.         };
  407.       }
  408.       break;
  409.  
  410.     default:
  411.       throw CR.NS_ERROR_INVALID_ARG;
  412.   } // switch (aMethod)
  413. };
  414.  
  415. /******************************************************************************
  416.  * flockIRichContentDropHandler Default Method Implementations
  417.  ******************************************************************************/
  418. FlockSvcUtils.flockIRichContentDropHandler.addDefaultMethod =
  419. function addDefaultMethod(aComponent, aMethod) {
  420.  
  421.   var svc = aComponent;
  422.   var proto = aComponent.__proto__;
  423.  
  424.   switch (aMethod) {
  425.  
  426.     case "_handleTextareaDrop":
  427.       if (!proto._handleTextareaDrop) {
  428.         proto._handleTextareaDrop =
  429.         function handleTextareaDrop(aSvcName, aDomains, aTextarea, aCallback) {
  430.           const WD_XPATH = 0;
  431.           const WD_FLAVOUR = 1;
  432.  
  433.           if (aTextarea instanceof CI.nsIDOMHTMLTextAreaElement) {
  434.             var doc = aTextarea.ownerDocument;
  435.             if (doc instanceof CI.nsIDOMHTMLDocument) {
  436.               var wd = FlockSvcUtils.getWD(this);
  437.               var domainsArray = aDomains.split(",");
  438.               for each (var domain in domainsArray) {
  439.                 if (wd.testDomain(doc.URL, domain)) {
  440.                   // Retrieve the specific fields from Web Detective to which
  441.                   // we cannot DnD
  442.                   var fields = wd.getString(aSvcName,
  443.                                             "avoidDnDXPathFields", null);
  444.                   if (fields) {
  445.                     fields = fields.split(";");
  446.                     for each (var avoidDnD in fields) {
  447.                       var xPath = wd.getString(aSvcName, avoidDnD, null);
  448.                       if (xPath) {
  449.                         var results = doc.evaluate(xPath, doc, null,
  450.                                                    CI.nsIDOMXPathResult.ANY_TYPE,
  451.                                                    null);
  452.                         if (results && results.iterateNext() == aTextarea) {
  453.                           // The matching field does not accept rich content, bail
  454.                           return true;
  455.                         }
  456.                       }
  457.                     }
  458.                   }
  459.  
  460.                   // Retrieve the specific fields from Web Detective to which
  461.                   // we can DnD
  462.                   var pairs = [];
  463.                   fields = wd.getString(aSvcName, "dndXPathFields", null);
  464.                   if (fields) {
  465.                     fields = fields.split(";");
  466.                     for each (var xpfFields in fields) {
  467.                       pairs.push(xpfFields);
  468.                     }
  469.                   }
  470.  
  471.                   // Go through the list of DnD fields to find a match
  472.                   for each (var xpfPair in pairs) {
  473.                     var xpf = xpfPair.split(",");
  474.                     var xPath = wd.getString(aSvcName, xpf[WD_XPATH], null);
  475.                     if (xPath) {
  476.                       var results = doc.evaluate(xPath, doc, null,
  477.                                                  CI.nsIDOMXPathResult.ANY_TYPE,
  478.                                                  null);
  479.                       if (results && results.iterateNext() == aTextarea) {
  480.                         // Let the service perform the drop via the callback
  481.                         aCallback(xpf[WD_FLAVOUR]);
  482.                         return true;
  483.                       }
  484.                     }
  485.                   }
  486.                 }
  487.               }
  488.             }
  489.           }
  490.           return false;
  491.         }
  492.       }
  493.       break;
  494.  
  495.     default:
  496.       throw CR.NS_ERROR_INVALID_ARG;
  497.   } // switch (aMethod)
  498. };
  499.